#pragma once

#include<iostream>
#include<vector>
#include <semaphore.h>
#include <pthread.h>
using namespace std;
//环形队列数组实现
const static int cmz=5;

template<class T>
class RingQueue
{
public:
void P(sem_t &sem)//引用
{
sem_wait(&sem);
}
void V(sem_t &sem)
{
sem_post(&sem);
}
    RingQueue(int cap=cmz):cap_(cap),c_step_(0),p_step_(0)
    {
        q.resize(cap_);
       sem_init(&cdata_sem_,0,0);
       sem_init(&pspace_sem_,0,cap_);
    }
    void push(T& in)
    {
        P(pspace_sem_);
        q[p_step_]=in;
        V(cdata_sem_);
        p_step_=(p_step_+1)%cap_;
    }
    void pop(T& out)
    {
        P(cdata_sem_);
        out=q[c_step_];
        V(pspace_sem_);
        c_step_=(c_step_+1)%cap_;
    }
    ~RingQueue()
    {
        sem_destroy(&cdata_sem_);
        sem_destroy(&pspace_sem_);
    }
private:
    vector<T> q;
    int cap_;

    int c_step_;       // 消费者下标
    int p_step_;       // 生产者下标

    sem_t cdata_sem_;  // 消费者关注的数据资源
    sem_t pspace_sem_; // 生产者关注的空间资源
};